home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1996 #6 / Amiga Plus CD - 1996 - No. 06.iso / pd / programmierung / programmers / reloc.a < prev   
Text File  |  1996-06-23  |  4KB  |  211 lines

  1. ; A small reloc routine for those who include the module directly in
  2. ; the program code.
  3.  
  4. ; NOTE: The module pointer is passed in register A0. Use stubs with
  5. ;    C.
  6.  
  7.         SECTION    "text",code
  8.  
  9.         XDEF    _RelocModule
  10.  
  11. mmd_songinfo    EQU    8
  12. mmd_blockarr    EQU    16
  13. mmd_expdata    EQU    32
  14. mmd_songsleft    EQU    51
  15. msng_numblocks    EQU    504
  16. msng_pseqs    EQU    508
  17. msng_numsamples    EQU    787
  18.  
  19. reloci        move.l    24(a2),d0
  20.         beq.s    xloci
  21.         movea.l    d0,a0
  22.         moveq   #0,d0
  23.         move.b  msng_numsamples(a1),d0    ;number of samples
  24.         subq.b  #1,d0
  25. relocs        bsr.s   relocentr
  26.         move.l    -4(a0),d3    ;sample ptr
  27.         beq.s    nosyn
  28.         move.l    d3,a3
  29.         tst.w    4(a3)
  30.         bpl.s    nosyn        ;type >= 0
  31.         move.w    20(a3),d2    ;number of waveforms
  32.         lea    278(a3),a3    ;ptr to wf ptrs
  33.         subq.w    #1,d2
  34. relsyn        add.l    d3,(a3)+
  35.         dbf    d2,relsyn
  36. nosyn        dbf     d0,relocs
  37. xloci        rts
  38. norel        addq.l    #4,a0
  39.         rts
  40. relocentr    tst.l   (a0)
  41.         beq.s   norel
  42.         add.l   d1,(a0)+
  43.         rts
  44. _RelocModule:
  45.         movem.l    a2-a4/d2-d4,-(sp)
  46.         movea.l a0,a2
  47.         move.l  a2,d1        ;d1 = ptr to start of module
  48.         bsr.s    relocp
  49.         movea.l mmd_songinfo(a2),a1
  50.         bsr.s    reloci
  51.         move.b    mmd_songsleft(a2),d4
  52. rel_lp        bsr.s    relocb
  53.         cmp.b    #'T',3(a2)    ;MCNT?
  54.         beq.s    norelmmd2
  55.         cmp.b    #'2',3(a2)    ;MMD2?
  56.         bcs.s    norelmmd2
  57.         bsr.w    relocmmd2sng
  58. norelmmd2    move.l    mmd_expdata(a2),d0    ;extension struct
  59.         beq.s    rel_ex
  60.         move.l    d0,a0
  61.         bsr.s    relocentr    ;ptr to next module
  62.         bsr.s    relocentr    ;InstrExt...
  63.         addq.l    #4,a0        ;skip sizes of InstrExt
  64. ; We reloc the pointers of MMD0exp, so anybody who needs them can easily
  65. ; read them.
  66.         bsr.s    relocentr    ;annotxt
  67.         addq.l    #4,a0        ;annolen
  68.         bsr.s    relocentr    ;InstrInfo
  69.         addq.l    #8,a0
  70.         bsr.s    relocentr    ;rgbtable (not useful for most people)
  71.         addq.l    #4,a0        ;skip channelsplit
  72.         bsr.s    relocentr    ;NotationInfo
  73.         bsr.s    relocentr    ;songname
  74.         addq.l    #4,a0        ;skip song name length
  75.         bsr.s    relocentr    ;MIDI dumps
  76.         bsr.s    relocmdd
  77.         bsr.s    relocentr    ;mmdinfo
  78.         bsr.s    relocentr    ;mmdrexx
  79.         bsr.w    relocrx
  80.         bsr.s    relocentr    ;mmdcmd3x
  81.         bsr.w    reloccmd3x
  82.         subq.b    #1,d4        ;songs left..?
  83.         bcs.s    rel_ex
  84.         move.l    d0,a0
  85.         move.l    (a0),d0
  86.         beq.s    rel_ex
  87.         move.l    d0,a2
  88.         bsr.s    relocp
  89.         movea.l 8(a2),a1
  90.         bra.s    rel_lp
  91. rel_ex        movem.l    (sp)+,d2-d4/a2-a4
  92.         rts
  93.  
  94. relocp        lea    mmd_songinfo(a2),a0
  95.         bsr.w    relocentr
  96.         addq.l    #4,a0
  97.         bsr.w    relocentr
  98.         addq.l    #4,a0
  99.         bsr.w    relocentr
  100.         addq.l    #4,a0
  101.         bra.w    relocentr
  102.  
  103. relocb        move.l    mmd_blockarr(a2),d0
  104.         beq.s    xlocb
  105.         movea.l    d0,a0
  106.         move.w  msng_numblocks(a1),d0
  107.         subq.b  #1,d0
  108. rebl        bsr    relocentr
  109.         dbf     d0,rebl
  110.         cmp.b    #'T',3(a2)    ;MMD0 (= MCNT)
  111.         beq.s    xlocb
  112.         cmp.b    #'1',3(a2)    ;test MMD type
  113.         bge.w    relocbi
  114. xlocb        rts
  115.  
  116. relocmdd    movem.l    d0/a0,-(sp)
  117.         tst.l    -(a0)
  118.         beq.s    xlocmdd
  119.         movea.l    (a0),a0
  120.         move.w    (a0),d0        ;# of msg dumps
  121.         addq.l    #8,a0
  122. 1$        beq.s    xlocmdd
  123.         bsr    relocentr
  124.         bsr.s    relocdmp
  125.         subq.w    #1,d0
  126.         bra.s    1$
  127. xlocmdd        movem.l    (sp)+,d0/a0
  128.         rts
  129.  
  130. relocrxtrig    movem.l    d0/a0,-(sp)
  131.         subq.l    #4,a0
  132. 2$        move.l    (a0),d0
  133.         beq.s    1$
  134.         move.l    d0,a0
  135.         addq.l    #8,a0
  136.         bsr    relocentr    ;command name
  137.         bsr    relocentr    ;port name
  138.         move.l    d0,a0
  139.         bra.s    2$
  140. 1$        movem.l    (sp)+,d0/a0
  141.         rts
  142.  
  143. relocrx        movem.l    d0/a0,-(sp)
  144.         move.l    -(a0),d0
  145.         beq.s    1$
  146.         move.l    d0,a0
  147.         addq.l    #4,a0        ;skip res, trigcmdlen
  148.         bsr    relocentr
  149.         bsr.s    relocrxtrig
  150. 1$        movem.l    (sp)+,d0/a0
  151.         rts
  152.  
  153. reloccmd3x    movem.l    d0/a0,-(sp)
  154.         move.l    -(a0),d0
  155.         beq.s    1$
  156.         move.l    d0,a0
  157.         addq.l    #4,a0    ;skip struct_vers, pad, num_of_settings
  158.         bsr    relocentr    ;ctrlr_types
  159.         bsr    relocentr    ;ctrlr_numbers
  160. 1$        movem.l    (sp)+,d0/a0
  161.         rts
  162.  
  163. relocdmp    move.l    -4(a0),d3
  164.         beq.s    xlocdmp
  165.         exg.l    a0,d3        ;save
  166.         addq.l    #4,a0
  167.         bsr    relocentr    ;reloc data pointer
  168.         move.l    d3,a0        ;restore
  169. xlocdmp        rts
  170.  
  171. relocbi        move.w    msng_numblocks(a1),d0
  172.         move.l    a0,a3
  173. biloop        subq.w    #1,d0
  174.         bmi.s    xlocdmp
  175.         move.l    -(a3),a0
  176.         addq.l    #4,a0
  177.         bsr    relocentr    ;BlockInfo ptr
  178.         tst.l    -(a0)
  179.         beq.s    biloop
  180.         move.l    (a0),a0
  181.         bsr    relocentr    ;hldata
  182.         bsr    relocentr    ;block name
  183.         addq.l    #4,a0        ;skip blocknamelen
  184.         bsr    relocentr    ;pagetable
  185.         tst.l    -(a0)
  186.         bne.s    relocpgtbl
  187.         bra.s    biloop
  188. ; take care of the new features of MMD2s
  189. relocmmd2sng    move.l    mmd_songinfo(a2),a0
  190.         lea    msng_pseqs(a0),a0
  191.         bsr    relocentr    ;playseqtable
  192.         bsr    relocentr    ;sectiontable
  193.         bsr    relocentr    ;trackvols
  194.         addq.l    #4,a0
  195.         bsr    relocentr    ;trackpans
  196.         move.w    -6(a0),d0    ;numpseqs
  197.         move.l    -20(a0),a0    ;get back to playseqtable
  198.         subq.w    #1,d0
  199. psqtblloop    bsr    relocentr
  200.         dbf    d0,psqtblloop
  201.         rts
  202. relocpgtbl    movea.l    (a0),a4        ;page table list hdr
  203.         move.w    (a4),d2
  204.         subq.w    #1,d2
  205.         lea    4(a4),a0
  206. pgtblloop    bsr    relocentr
  207.         dbf    d2,pgtblloop
  208.         bra    biloop
  209.  
  210.         END
  211.